<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.6.3" />
<title>CCNx Content Object</title>
<style type="text/css">
/* Sans-serif font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
div#toctitle,
span#author, span#revnumber, span#revdate, span#revremark,
div#footer {
  font-family: Arial,Helvetica,sans-serif;
}

/* Serif font. */
div.sectionbody {
  font-family: Georgia,"Times New Roman",Times,serif;
}

/* Monospace font. */
tt {
  font-size: inherit;
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

tt {
  font-size: inherit;
  color: navy;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}

div.sectionbody {
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}
ul > li     { color: #aaa; }
ul > li > * { color: black; }

pre {
  padding: 0;
  margin: 0;
}

span#author {
  color: #527bbd;
  font-weight: bold;
  font-size: 1.1em;
}
span#email {
}
span#revnumber, span#revdate, span#revremark {
}

div#footer {
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
div#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
div#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

div#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.0em;
  margin-bottom: 2.0em;
  margin-right: 10%;
  color: #606060;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid #dddddd;
  border-left: 4px solid #f0f0f0;
  padding: 0.5em;
}

div.listingblock > div.content {
  border: 1px solid #dddddd;
  border-left: 5px solid #f0f0f0;
  background: #f8f8f8;
  padding: 0.5em;
}

div.quoteblock, div.verseblock {
  padding-left: 1.0em;
  margin-left: 1.0em;
  margin-right: 10%;
  border-left: 5px solid #f0f0f0;
  color: #777777;
}

div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock > pre.content {
  font-family: inherit;
  font-size: inherit;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 3px solid #dddddd;
}

div.exampleblock > div.content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; }
a.image:visited { color: white; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

div.tableblock > table {
  border: 3px solid #527bbd;
}
thead, p.table.header {
  font-weight: bold;
  color: #527bbd;
}
tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

.footnote, .footnoteref {
  font-size: 0.8em;
}

span.footnote, span.footnoteref {
  vertical-align: super;
}

#footnotes {
  margin: 20px 0 20px 0;
  padding: 7px 0 0 0;
}

#footnotes div.footnote {
  margin: 0 0 5px 0;
}

#footnotes hr {
  border: none;
  border-top: 1px solid silver;
  height: 1px;
  text-align: left;
  margin-left: 0;
  width: 20%;
  min-width: 100px;
}

div.colist td {
  padding-right: 0.5em;
  padding-bottom: 0.3em;
  vertical-align: top;
}
div.colist td img {
  margin-top: 0.3em;
}

@media print {
  div#footer-badges { display: none; }
}

div#toc {
  margin-bottom: 2.5em;
}

div#toctitle {
  color: #527bbd;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}

</style>
<script type="text/javascript">
/*<![CDATA[*/
window.onload = function(){asciidoc.footnotes();}
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
    // Function that scans the DOM tree for header elements (the DOM2
    // nodeIterator API would be a better technique but not supported by all
    // browsers).
    var iterate = function (el) {
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
          var mo = re.exec(i.tagName);
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
          }
          iterate(i);
        }
      }
    }
    iterate(el);
    return result;
  }

  var toc = document.getElementById("toc");
  var entries = tocEntries(document.getElementById("content"), toclevels);
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.element.id == "")
      entry.element.id = "_toc_" + i;
    var a = document.createElement("a");
    a.href = "#" + entry.element.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
  if (entries.length == 0)
    toc.parentNode.removeChild(toc);
},


/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////

/* Based on footnote generation code from:
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
 */

footnotes: function () {
  var cont = document.getElementById("content");
  var noteholder = document.getElementById("footnotes");
  var spans = cont.getElementsByTagName("span");
  var refs = {};
  var n = 0;
  for (i=0; i<spans.length; i++) {
    if (spans[i].className == "footnote") {
      n++;
      // Use [\s\S] in place of . so multi-line matches work.
      // Because JavaScript has no s (dotall) regex flag.
      note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
      noteholder.innerHTML +=
        "<div class='footnote' id='_footnote_" + n + "'>" +
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
        n + "</a>. " + note + "</div>";
      spans[i].innerHTML =
        "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
        "' title='View footnote' class='footnote'>" + n + "</a>]";
      var id =spans[i].getAttribute("id");
      if (id != null) refs["#"+id] = n;
    }
  }
  if (n == 0)
    noteholder.parentNode.removeChild(noteholder);
  else {
    // Process footnoterefs.
    for (i=0; i<spans.length; i++) {
      if (spans[i].className == "footnoteref") {
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
        href = href.match(/#.*/)[0];  // Because IE return full URL.
        n = refs[href];
        spans[i].innerHTML =
          "[<a href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
      }
    }
  }
}

}
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>CCNx Content Object</h1>
</div>
<div id="content">
<div class="sect1">
<h2 id="_source_references">Source references</h2>
<div class="sectionbody">
<div class="paragraph"><p><a href="xsd.html">ccnx.xsd</a> is the xml schema that describes what the xml rendition of ccn data (including ContentObject messages) should look like.</p></div>
<div class="paragraph"><p><a href="xsd.html">ccnx.xsd</a> is a dtd that should describe the same, in a less strongly-typed fashion.</p></div>
<div class="paragraph"><p><a href="DTAG.html">tagname.csvdict</a> contains the mapping between the DTAG values used in the binary encoding and the element names used in the XML representation.</p></div>
<div class="paragraph"><p>Below we will use a less formal abstract syntax to indicate how the pieces fit together.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_contentobject">ContentObject</h2>
<div class="sectionbody">
<div class="literalblock">
<div class="content">
<pre><tt>ContentObject ::= Signature
                  Name
                  SignedInfo
                  Content</tt></pre>
</div></div>
<div class="paragraph"><p>The ContentObject element represents some arbitrary binary data
(held in the Content element) together with its <a href="Name.html">Name</a>, some
additional bits of information (the SignedInfo), and a digital
Signature of the other three elements.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_signature">Signature</h2>
<div class="sectionbody">
<div class="paragraph"><p>See the <a href="SignatureGeneration.html">Signature Specification</a>.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_name">Name</h2>
<div class="sectionbody">
<div class="paragraph"><p>See the <a href="Name.html">CCNx Name Specification</a>.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_signedinfo">SignedInfo</h2>
<div class="sectionbody">
<div class="literalblock">
<div class="content">
<pre><tt>SignedInfo ::= PublisherPublicKeyDigest
               Timestamp
               Type?
               FreshnessSeconds?
               FinalBlockID?
               KeyLocator?</tt></pre>
</div></div>
<div class="sect2">
<h3 id="_publisherpublickeydigest">PublisherPublicKeyDigest</h3>
<div class="paragraph"><p>The PublisherPublicKeyDigest identifies the publisher that signed this
content.  The value is a SHA-256 digest of the public key of the publisher.</p></div>
</div>
<div class="sect2">
<h3 id="_timestamp">Timestamp</h3>
<div class="paragraph"><p>See <a href="Timestamp.html">CCNx Timestamp Specification</a></p></div>
</div>
<div class="sect2">
<h3 id="_type">Type</h3>
<div class="paragraph"><p>The primitive type of the ContentObject <strong>Content</strong>.
This is encoded as a 3-byte BLOB;
when viewed using a <tt>base64Binary</tt> encoding,
the encoded value has some mnemonic value.
The hex and decimal equivalents (in network byte order) are also given here for reference.
Note that the default of DATA is not encoded in the ContentObject - the entire
Type element is omitted.</p></div>
<div class="tableblock">
<table rules="all"
width="90%"
frame="border"
cellspacing="0" cellpadding="4">
<col width="8%" />
<col width="13%" />
<col width="13%" />
<col width="65%" />
<thead>
<tr>
<th align="center" valign="top"> Base64 </th>
<th align="center" valign="top">   Hex    </th>
<th align="center" valign="top"> Decimal </th>
<th align="left" valign="top">  Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><p class="table"><tt>DATA</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>0x0C04C0</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>787648</tt></p></td>
<td align="left" valign="top"><p class="table">default when Type element is absent</p></td>
</tr>
<tr>
<td align="center" valign="top"><p class="table"><tt>ENCR</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>0x10D091</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>1101969</tt></p></td>
<td align="left" valign="top"><p class="table">content is encrypted</p></td>
</tr>
<tr>
<td align="center" valign="top"><p class="table"><tt>GONE</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>0x18E344</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>1631044</tt></p></td>
<td align="left" valign="top"><p class="table">whiteout marker</p></td>
</tr>
<tr>
<td align="center" valign="top"><p class="table"><tt>KEY/</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>0x28463F</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>2639423</tt></p></td>
<td align="left" valign="top"><p class="table">public key</p></td>
</tr>
<tr>
<td align="center" valign="top"><p class="table"><tt>LINK</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>0x2C834A</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>2917194</tt></p></td>
<td align="left" valign="top"><p class="table">link</p></td>
</tr>
<tr>
<td align="center" valign="top"><p class="table"><tt>NACK</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>0x34008A</tt></p></td>
<td align="center" valign="top"><p class="table"><tt>3408010</tt></p></td>
<td align="left" valign="top"><p class="table">no content at this time</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_freshnessseconds">FreshnessSeconds</h3>
<div class="paragraph"><p>The optional FreshnessSeconds indicates how many seconds a node should
wait after the arrival of this ContentObject before marking it as
stale.  See <a href="Staleness.html">Staleness Specification</a>.</p></div>
</div>
<div class="sect2">
<h3 id="_finalblockid">FinalBlockID</h3>
<div class="paragraph"><p>The optional FinalBlockID indicates the identifier of the final block
in a sequence of fragments.  It should be present in the final block
itself, and may also be present in other fragments to provide advanced
warning of the end to consumers.  The value here should be equal to
the last explicit Name Component of the final block.</p></div>
</div>
<div class="sect2">
<h3 id="_keylocator">KeyLocator</h3>
<div class="paragraph"><p>A KeyLocator tells where to find the key to verify this content.  The
KeyLocator may be be omitted when the signer is really sure that
all parties can find the key by other means.  Name conventions can be used
to find the name of the key for a piece of content from the name of
the ContentObject.</p></div>
<div class="paragraph"><p>The <strong>PublisherPublicKeyDigest</strong> is used as the fast selector to identify the
signer of the content, not this locator.</p></div>
<div class="literalblock">
<div class="content">
<pre><tt>KeyLocator ::= Key
             | Certificate
             | KeyName</tt></pre>
</div></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_content">Content</h2>
<div class="sectionbody">
<div class="literalblock">
<div class="content">
<pre><tt>Content ::= BLOB</tt></pre>
</div></div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Last updated 2011-05-04 08:48:35 PDT
</div>
</div>
</body>
</html>
